<!DOCTYPE html>
<html lang="zh_cn">
<head>
          <title>来玩魔王的咚</title>
        <meta name="viewport" content="width=device-width, initial-scale=1" />
        <meta charset="utf-8" />
        <!-- twitter card metadata -->
<meta name="twitter:card" content="summary">
<meta name="twitter:image" content="/images/mowang.png">
<meta name="twitter:site" content="">
<meta name="twitter:title" content="C语言基本类型">
<meta name="twitter:description" content="<p>整数类型：八进制、十六进制；浮点类型；字符类型：转义字符，读写字符惯用法；类型转换：强制类型转换；类型定义：使用布尔值</p>">
        <!-- OG Tags -->
<meta property="og:url" content="/c-programming-base-type.html"/>
<meta property="og:title" content="来玩魔王的咚 | C语言基本类型" />
<meta property="og:description" content="<p>整数类型：八进制、十六进制；浮点类型；字符类型：转义字符，读写字符惯用法；类型转换：强制类型转换；类型定义：使用布尔值</p>" />
        <!-- favicon -->
        <link rel="icon" type="image/png" href="/images/mowang.png">
        <!-- moment.js for date formatting -->
        <script src="/theme/js/moment.js"></script>
        <!-- css -->
        <link rel="stylesheet" type="text/css" href="/theme/css/main.css" />
        <!-- 左边的menu，如果页面高度不够，就跟着滚动，否则文章分类显示不全 -->
        <link rel="stylesheet" type="text/css" href="/theme/css/mycss/menu.css" />
		<script>
			
                /*! grunt-grunticon Stylesheet Loader - v2.1.2 | https://github.com/filamentgroup/grunticon | (c) 2015 Scott Jehl, Filament Group, Inc. | MIT license. */
    
    (function(e){function t(t,n,r,o){"use strict";function a(){for(var e,n=0;u.length>n;n++)u[n].href&&u[n].href.indexOf(t)>-1&&(e=!0);e?i.media=r||"all":setTimeout(a)}var i=e.document.createElement("link"),l=n||e.document.getElementsByTagName("script")[0],u=e.document.styleSheets;return i.rel="stylesheet",i.href=t,i.media="only x",i.onload=o||null,l.parentNode.insertBefore(i,l),a(),i}var n=function(r,o){"use strict";if(r&&3===r.length){var a=e.navigator,i=e.Image,l=!(!document.createElementNS||!document.createElementNS("http://www.w3.org/2000/svg","svg").createSVGRect||!document.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image","1.1")||e.opera&&-1===a.userAgent.indexOf("Chrome")||-1!==a.userAgent.indexOf("Series40")),u=new i;u.onerror=function(){n.method="png",n.href=r[2],t(r[2])},u.onload=function(){var e=1===u.width&&1===u.height,a=r[e&&l?0:e?1:2];n.method=e&&l?"svg":e?"datapng":"png",n.href=a,t(a,null,null,o)},u.src="",document.documentElement.className+=" grunticon"}};n.loadCSS=t,e.grunticon=n})(this);(function(e,t){"use strict";var n=t.document,r="grunticon:",o=function(e){if(n.attachEvent?"complete"===n.readyState:"loading"!==n.readyState)e();else{var t=!1;n.addEventListener("readystatechange",function(){t||(t=!0,e())},!1)}},a=function(e){return t.document.querySelector('link[href$="'+e+'"]')},c=function(e){var t,n,o,a,c,i,u={};if(t=e.sheet,!t)return u;n=t.cssRules?t.cssRules:t.rules;for(var l=0;n.length>l;l++)o=n[l].cssText,a=r+n[l].selectorText,c=o.split(");")[0].match(/US\-ASCII\,([^"']+)/),c&&c[1]&&(i=decodeURIComponent(c[1]),u[a]=i);return u},i=function(e){var t,o,a;o="data-grunticon-embed";for(var c in e)if(a=c.slice(r.length),t=n.querySelectorAll(a+"["+o+"]"),t.length)for(var i=0;t.length>i;i++)t[i].innerHTML=e[c],t[i].style.backgroundImage="none",t[i].removeAttribute(o);return t},u=function(t){"svg"===e.method&&o(function(){i(c(a(e.href))),"function"==typeof t&&t()})};e.embedIcons=i,e.getCSS=a,e.getIcons=c,e.ready=o,e.svgLoadedCallback=u,e.embedSVG=u})(grunticon,this);
                
                grunticon(["/theme/css/icons.data.svg.css", "/theme/css/icons.data.png.css", "/theme/css/icons.fallback.css"]);
            </script>
        <noscript><link href="/theme/css/icons.fallback.css" rel="stylesheet"></noscript>
        <!-- menu toggle javascript -->
        <script type="text/javascript">
            document.addEventListener("DOMContentLoaded", initMenu);
            
            function initMenu(){
                var menu = document.getElementById("menu");
                var menulink = document.getElementById("menu-link");
                menulink.addEventListener("click", function toggleMenu(){
                        window.event.preventDefault();
                        menulink.classList.toggle('active');
                        menu.classList.toggle('active');              
                    });
            };
        </script>
        <!-- 不蒜子 -->
        <script async src="//busuanzi.ibruce.info/busuanzi/2.3/busuanzi.pure.mini.js"></script>

    <meta name="description" content="<p>整数类型：八进制、十六进制；浮点类型；字符类型：转义字符，读写字符惯用法；类型转换：强制类型转换；类型定义：使用布尔值</p>" />

    <meta name="tags" content="C语言" />
  <!-- 替换部分base的样式，看文章时，要再宽一点，右边有很多空间可以撑开 -->
  <link rel="stylesheet" type="text/css" href="/theme/css/mycss/article.css" />

</head>
<body>
    <div role="banner" id="masthead">
        <header>
            <a href="/"><img src="/images/mowang.png" alt="McManus Logo"></a>
                <h1>来玩魔王的咚@骑士救兵</h1>
            <a href="#menu" id="menu-link">more stuff</a>
            <nav id="menu">
                <ul>
                        <li><a href="/tags">tags</a></li>
                            <li><a href="/category/cloud.html">Cloud</a></li>
                            <li><a href="/category/docker.html">Docker</a></li>
                            <li><a href="/category/go.html">Go</a></li>
                            <li><a href="/category/linux.html">Linux</a></li>
                            <li><a href="/category/python.html">Python</a></li>
                            <li class="active"><a href="/category/xue-xi-bi-ji.html">学习笔记</a></li>
                            <li><a href="/category/yun-wei-zi-dong-hua.html">运维自动化</a></li>
                </ul>
            </nav>
        </header>
    </div>
        <div class="page" role="main">
  <div class="article" role="article">
    <article>
        <footer>
            <a name="top"></a>
            <p>
              <time datetime=" 2020-12-27 10:30:00+08:00">
                <script>document.write(moment('2020-12-27 10:30:00+08:00').format('LL'));</script>
              </time>
              ~
              <time datetime=" 2020-12-27 10:30:00+08:00">
                <script>document.write(moment('2020-12-27 11:00:00+08:00').format('LL'));</script>
              </time>
            </p>
        </footer>
        <header>
          <h2>
            C语言基本类型
          </h2>
        </header>
      <div class="content">
         <div class="toc">
<ul>
<li><a href="#zheng-shu-lei-xing">整数类型</a><ul>
<li><a href="#ba-jin-zhi-shi-liu-jin-zhi">八进制、十六进制</a></li>
<li><a href="#zheng-shu-chang-liang">整数常量</a></li>
<li><a href="#du-xie-zheng-shu">读写整数</a></li>
</ul>
</li>
<li><a href="#fu-dian-lei-xing">浮点类型</a><ul>
<li><a href="#fu-dian-chang-liang">浮点常量</a></li>
<li><a href="#du-xie-fu-dian-shu">读写浮点数</a></li>
</ul>
</li>
<li><a href="#zi-fu-lei-xing">字符类型</a><ul>
<li><a href="#zhuan-yi-zi-fu">转义字符</a></li>
<li><a href="#du-xie-zi-fu">读写字符</a></li>
</ul>
</li>
<li><a href="#lei-xing-zhuan-huan">类型转换</a><ul>
<li><a href="#yin-shi-zhuan-huan">隐式转换</a></li>
<li><a href="#qiang-zhi-lei-xing-zhuan-huan">强制类型转换</a></li>
</ul>
</li>
<li><a href="#lei-xing-ding-yi">类型定义</a><ul>
<li><a href="#shi-yong-bu-er-zhi">使用布尔值</a></li>
<li><a href="#c99-zhong-shi-yong-bu-er-zhi">C99中使用布尔值</a></li>
</ul>
</li>
</ul>
</div>
<h3 id="zheng-shu-lei-xing"><a class="toclink" href="#zheng-shu-lei-xing">整数类型</a></h3>
<p>int：整形，在其他类型中可省略<br>
long：长整形<br>
short：短整形<br>
signed：有符号，默认可省略<br>
unsigned：无符号<br>
以上组合一共也就实际的6种：</p>
<div class="highlight"><pre><span></span><code>short int
unsigned short int
int
unsigned int
long int
unsigned long int
</code></pre></div>

<p>最后的int都是可省的。  </p>
<p>64位机器的整数类型：</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="right">最小值</th>
<th align="right">最大值</th>
<th align="right">最大值2</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">short</td>
<td align="right">-32,768</td>
<td align="right">32,767</td>
<td align="right">2^15-1</td>
</tr>
<tr>
<td align="left">unsigned short</td>
<td align="right">0</td>
<td align="right">65535</td>
<td align="right">2^16-1</td>
</tr>
<tr>
<td align="left">int</td>
<td align="right">-2,147,483,648</td>
<td align="right">2,147,483,647</td>
<td align="right">2^31-1</td>
</tr>
<tr>
<td align="left">unsigned</td>
<td align="right">0</td>
<td align="right">4,294,967,295</td>
<td align="right">2^32-1</td>
</tr>
<tr>
<td align="left">long</td>
<td align="right">-9,223,372,036,854,775,808</td>
<td align="right">9,223,372,036,854,775,807</td>
<td align="right">2^63-1</td>
</tr>
<tr>
<td align="left">unsigned long</td>
<td align="right">0</td>
<td align="right">18,446,744,073,709,551,615</td>
<td align="right">2^64-1</td>
</tr>
</tbody>
</table>
<p>另外还有两种类型：<code>long long</code>、<code>unsigned long long</code>。要求至少是64位宽，在64位机器中和长整形一样。  </p>
<p>不同的整数类型对应不同操作系统中的位宽：</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="right">16位系统</th>
<th align="right">32位系统</th>
<th align="right">64位系统</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">短整型</td>
<td align="right">16</td>
<td align="right">16</td>
<td align="right">16</td>
</tr>
<tr>
<td align="left">整型</td>
<td align="right">16</td>
<td align="right">32</td>
<td align="right">32</td>
</tr>
<tr>
<td align="left">长整型</td>
<td align="right">32</td>
<td align="right">32</td>
<td align="right">64</td>
</tr>
<tr>
<td align="left">长长整型</td>
<td align="right">64</td>
<td align="right">64</td>
<td align="right">64</td>
</tr>
</tbody>
</table>
<p>比如：整型在64位系统中的位宽是32，对应的int类型的范围就是(-2^31 ~ 2^31-1)，有一位是符号位。  </p>
<h4 id="ba-jin-zhi-shi-liu-jin-zhi"><a class="toclink" href="#ba-jin-zhi-shi-liu-jin-zhi">八进制、十六进制</a></h4>
<p>八进制数以0开头表示：<code>0777</code>。<br>
十六进制数以0x开头表示：<code>0x7fff</code>。前面的x和后面的a-f，大小写都可以。  </p>
<h4 id="zheng-shu-chang-liang"><a class="toclink" href="#zheng-shu-chang-liang">整数常量</a></h4>
<p>强制编译器指定整数常量的类型：</p>
<ul>
<li>L或l：长整形</li>
<li>U或u：无符号类型</li>
<li>LL或ll：长长整形</li>
</ul>
<p>比如：<code>15U 15L 15LU 15UL 15LLU 15ULL</code>。标记放在数字后面，可以组合顺序无所谓。  </p>
<h4 id="du-xie-zheng-shu"><a class="toclink" href="#du-xie-zheng-shu">读写整数</a></h4>
<p>在printf函数和scanf函数的调用中会用到：</p>
<ul>
<li>%d : int，有符号十进制</li>
<li>%u : 无符号，十进制</li>
<li>%o : 无符号，八进制</li>
<li>%x : 无符号，十六进制</li>
<li>h : 短整数，加在d、u、o、x前面</li>
<li>l ： 长整数，加在d、u、o、x前面</li>
<li>ll ： 长长整数，加在d、u、o、x前面</li>
</ul>
<h3 id="fu-dian-lei-xing"><a class="toclink" href="#fu-dian-lei-xing">浮点类型</a></h3>
<p>float：单精度浮点数，一般精度要求不高用这个就好了<br>
double：双精度浮点数，默认系统用这个<br>
long double：扩展精度浮点数  </p>
<p>浮点类型特征（IEEE标准）：</p>
<table>
<thead>
<tr>
<th align="left">类型</th>
<th align="left">最小正值</th>
<th align="left">最大值</th>
<th align="right">精度</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">float</td>
<td align="left">1.17549E-38</td>
<td align="left">3.40282E38</td>
<td align="right">6个有效数字</td>
</tr>
<tr>
<td align="left">double</td>
<td align="left">2.22507E-308</td>
<td align="left">1.79769E308</td>
<td align="right">15个有效数字</td>
</tr>
</tbody>
</table>
<h4 id="fu-dian-chang-liang"><a class="toclink" href="#fu-dian-chang-liang">浮点常量</a></h4>
<p>可以用小数形式，小数点前后的0都能省略：<code>57.0 57. 0.57 .57</code>。<br>
可以用科学计数法，用字母E或e：<code>57E0 5.7e1 5.7e+1 570.e-1</code>。  </p>
<p>由于默认的精度是double，可以强制指定为精度：</p>
<ul>
<li>F或f：指定常量为float类型，<code>57。0F</code>  </li>
<li>L或l：指定常量为long double类型，<code>57.0L</code></li>
</ul>
<p>同整数类型不同，整数类型默认是int，并且最常用的也是int，所以数字后面一般不用添加标记。<br>
对于浮点数，在对精度要求不高的时候，可以使用float类型。但是默认类型是double，所以要在浮点常量后加上f或F来强制指定类型。  </p>
<h4 id="du-xie-fu-dian-shu"><a class="toclink" href="#du-xie-fu-dian-shu">读写浮点数</a></h4>
<p>在printf函数和scanf函数的调用中会用到：</p>
<ul>
<li>%e : float类型，指数形式</li>
<li>%f : float类型，小数形式</li>
<li>%g : float类型，输出的时候自动选项指数形式或小数形式</li>
<li>l : double类型，加在e、f、g前面</li>
<li>L : long double，加在e、f、g前面</li>
</ul>
<p>在printf中的l是不起作用的，因为会自动适配float或double。  </p>
<h3 id="zi-fu-lei-xing"><a class="toclink" href="#zi-fu-lei-xing">字符类型</a></h3>
<p>char：字符类型（也称字符型）。  </p>
<p>定义字符类型变量：</p>
<div class="highlight"><pre><span></span><code><span class="kt">char</span><span class="w"> </span><span class="n">ch</span><span class="p">;</span><span class="w"></span>
<span class="kt">signed</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">sch</span><span class="p">;</span><span class="w"></span>
<span class="kt">unsigned</span><span class="w"> </span><span class="kt">char</span><span class="w"> </span><span class="n">uch</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>由于没有明确规定底层的整数是否有符号，在需要明确的时候，使用后两种做明确定义。<br>
字符型之间的操作无所谓是否有符号，但是当和整数进行相关计算的时候，可能会有影响。  </p>
<h4 id="zhuan-yi-zi-fu"><a class="toclink" href="#zhuan-yi-zi-fu">转义字符</a></h4>
<p>字符转义序列（character escape）：只有常用的基本字符<br>
数字转义序列（numeric escape）：可以转义所有的字符  </p>
<p>字符转义序列：</p>
<table>
<thead>
<tr>
<th align="left">名称</th>
<th>转义字符</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left">蜂鸣</td>
<td>\a</td>
</tr>
<tr>
<td align="left">退格</td>
<td>\b</td>
</tr>
<tr>
<td align="left">换页符</td>
<td>\f</td>
</tr>
<tr>
<td align="left">换行符</td>
<td>\n</td>
</tr>
<tr>
<td align="left">回车符</td>
<td>\r</td>
</tr>
<tr>
<td align="left">水平制表符</td>
<td>\t</td>
</tr>
<tr>
<td align="left">垂直制表符</td>
<td>\v</td>
</tr>
<tr>
<td align="left">反斜杠</td>
<td>\</td>
</tr>
<tr>
<td align="left">问号</td>
<td>\?</td>
</tr>
<tr>
<td align="left">单引号</td>
<td>\'</td>
</tr>
<tr>
<td align="left">双引号</td>
<td>\"</td>
</tr>
</tbody>
</table>
<p>单个问号一般不用转义，但是连续的两个问号有特别的含义（三字符序列以??开头），这时最好至少把后面的问号进行转义：<code>?\?</code>。  </p>
<p>八进制转义序列：反斜杠后跟一个最多三位数的八进制数。八进制数要以0开头，不过这里可以省略0。这是一个无符号的八进制数，最大值通常是377，就是十进制的255。比如：<code>\33 \033</code>。  </p>
<p>十六进制转义序列：反斜杠后是x，之后跟一个十六进制数。如果字符长度是8，那么最大值是0xFF也就是255。比如：<code>\x1b \x1B</code>。  </p>
<p>这里只考虑ASCII字符的转义，所以字符长度是8，就是0-255的字符。utf-8，unicode什么的没提。  </p>
<p>数字转义太晦涩，建议定义为常量使用：</p>
<div class="highlight"><pre><span></span><code><span class="cp">#define ESC &#39;\033&#39; </span><span class="cm">/* ASCII escape character */</span><span class="cp"></span>
</code></pre></div>

<h4 id="du-xie-zi-fu"><a class="toclink" href="#du-xie-zi-fu">读写字符</a></h4>
<p>在printf函数和scanf函数的调用中会用到：</p>
<ul>
<li>%c : 对单个字符进行读写</li>
</ul>
<p>比较下面的例子：</p>
<div class="highlight"><pre><span></span><code><span class="kt">char</span><span class="w"> </span><span class="n">ch</span><span class="p">;</span><span class="w"></span>
<span class="n">scanf</span><span class="p">(</span><span class="s">&quot;%c&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">ch</span><span class="p">);</span><span class="w"></span>
<span class="n">scanf</span><span class="p">(</span><span class="s">&quot; %c&quot;</span><span class="p">,</span><span class="w"> </span><span class="o">&amp;</span><span class="n">ch</span><span class="p">);</span><span class="w"></span>
</code></pre></div>

<p>前面的语句，会读取紧接着的第一个字符，包括空白符。<br>
后面的语句，在前面多了一个空格，那么会首先跳过另个或多个空白符。效果是读取紧接着的第一个非空白字符。  </p>
<p>getchar函数：读入一个字符。<br>
putchar函数：写入单个字符。<br>
建议用这两个函数代替scanf和printf进行字符的读写，速度更快。但是也只能进行字符的读写。<br>
而scanf和printf可以和其他的整数类型、浮点数类型复用，更灵活。也是有应用场景的。  </p>
<h5 id="guan-yong-fa"><a class="toclink" href="#guan-yong-fa">惯用法</a></h5>
<p>跳过本行剩下的字符：</p>
<div class="highlight"><pre><span></span><code><span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="n">getchar</span><span class="p">()</span><span class="w"> </span><span class="o">!=</span><span class="w"> </span><span class="sc">&#39;\n&#39;</span><span class="p">)</span><span class="w"></span>
<span class="w">    </span><span class="cm">/* 空语句 */</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>跳过不定数量的空格:</p>
<div class="highlight"><pre><span></span><code><span class="k">while</span><span class="w"> </span><span class="p">((</span><span class="n">ch</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">getchar</span><span class="p">())</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="sc">&#39; &#39;</span><span class="p">)</span><span class="w"></span>
<span class="w">    </span><span class="cm">/* 空语句 */</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>循环终止时，变量ch将包含getchar遇到的第一个非空格字符。  </p>
<h3 id="lei-xing-zhuan-huan"><a class="toclink" href="#lei-xing-zhuan-huan">类型转换</a></h3>
<p>有两种类型转换：</p>
<ol>
<li>隐式转换（implicit conversion）</li>
<li>显式转换（explicit conversion）</li>
</ol>
<h4 id="yin-shi-zhuan-huan"><a class="toclink" href="#yin-shi-zhuan-huan">隐式转换</a></h4>
<p>以下情况会进行隐式转换：
一、算术表达式或逻辑表达式中操作数的类型不同时。<br>
二、赋值运算符右侧表达式的类型和左侧变量的类型不匹配时。<br>
三、函数调用中的实参类型与其对应的形参类型不匹配时。<br>
四、return语句中表达式的类型和函数返回值的类型不匹配时。  </p>
<h4 id="qiang-zhi-lei-xing-zhuan-huan"><a class="toclink" href="#qiang-zhi-lei-xing-zhuan-huan">强制类型转换</a></h4>
<p>强制类型转换表达式的格式如下：</p>
<div class="highlight"><pre><span></span><code>(类型名) 表达式
</code></pre></div>

<p>这里(类型名)视为一元运算符。一元运算符的优先级高于二元运算符。  </p>
<p>参考例子：</p>
<div class="highlight"><pre><span></span><code><span class="kt">float</span><span class="w"> </span><span class="n">quotient</span><span class="p">;</span><span class="w"></span>
<span class="kt">int</span><span class="w"> </span><span class="n">dividend</span><span class="p">,</span><span class="w"> </span><span class="n">divisor</span><span class="p">;</span><span class="w"></span>
<span class="n">quotient</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="kt">float</span><span class="p">)</span><span class="w"> </span><span class="n">dividend</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="n">divisor</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>这里只对dividend做了强制类型转换。变量divisor不需要强转，因为把dividend强转为float类型后，divisor会进行隐式转换。  </p>
<h3 id="lei-xing-ding-yi"><a class="toclink" href="#lei-xing-ding-yi">类型定义</a></h3>
<p><strong>类型定义</strong>（type definition），能使程序更加易于理解，前提是选择使用有意义的类型名。<br>
比如定义一个用于存储美元的类型：</p>
<div class="highlight"><pre><span></span><code><span class="n">typeof</span><span class="w"> </span><span class="kt">float</span><span class="w"> </span><span class="n">Dollars</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>使用了类型定义后，还有一个好处。能使程序更加容易修改，只需要改变类型定义的类型，就能改变整个程序中这个名称的实际类型。<br>
比如，使用后发现float类型精度不够，需要使用double类型，那么只需要改变类型定义就足够了：</p>
<div class="highlight"><pre><span></span><code><span class="n">typeof</span><span class="w"> </span><span class="kt">double</span><span class="w"> </span><span class="n">Dollars</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>如果未使用类型定义的话，需要去修改所有使用float表示美元的变量。  </p>
<h4 id="shi-yong-bu-er-zhi"><a class="toclink" href="#shi-yong-bu-er-zhi">使用布尔值</a></h4>
<p>旧标准的C语言中没有布尔类型，一般都是用int类型代替，而值就是0和1来代替。<br>
为了使程序易于理解，可以做以下的优化：</p>
<ol>
<li>使用有意义的类型名称，定义宏或者用<strong>类型定义</strong></li>
<li>使用有意义的值，定义宏</li>
</ol>
<p>有下面两种方式定义布尔类型：</p>
<div class="highlight"><pre><span></span><code><span class="cp">#define BOOL int</span>
<span class="k">typedef</span><span class="w"> </span><span class="kt">int</span><span class="w"> </span><span class="n">Bool</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>第一种是创建宏来定义，只能放在文件开头部分，还有其他缺点，不推荐。<br>
第二种是利用类型定义，这样定义的名称还有作用域范围。总之，推用这个。<br>
另外，在C99中已经有布尔类型了，还有新的头文件。建议用新的头文件提供的名称，详见下一小节。  </p>
<p>添加下面的宏定义作为布尔类型的值：</p>
<div class="highlight"><pre><span></span><code><span class="cp">#define TRUE 1</span>
<span class="cp">#define FALSE 0</span>
</code></pre></div>

<h4 id="c99-zhong-shi-yong-bu-er-zhi"><a class="toclink" href="#c99-zhong-shi-yong-bu-er-zhi">C99中使用布尔值</a></h4>
<p>在C99中提供了布尔类型<code>_Bool</code>，可以直接使用：</p>
<div class="highlight"><pre><span></span><code><span class="kt">_Bool</span><span class="w"> </span><span class="n">flag</span><span class="p">;</span><span class="w"></span>
</code></pre></div>

<p>这底层是一个无符号整型，并且只能赋值为0或1。<br>
<em>这个名称很丑陋，但是根据C89标准，以下划线后跟一个大写字母的名称是保留字。所以这个名称理论上是一定不会和已有的名称冲突的。</em>  </p>
<p>在C99中还提供了一个新的头<code>&lt;stdbool.h&gt;</code>，提供了类型名称bool，还提供了值true和false。用起来更加方便：</p>
<div class="highlight"><pre><span></span><code><span class="cp">#include</span><span class="w"> </span><span class="cpf">&lt;stdbool.h&gt;</span><span class="cp"></span>
<span class="kt">bool</span><span class="w"> </span><span class="n">flag</span><span class="p">;</span><span class="w">  </span><span class="cm">/* 效果和 _Bool flag; 一样 */</span><span class="w"></span>
<span class="n">flag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">false</span><span class="p">;</span><span class="w"></span>
<span class="n">flag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nb">true</span><span class="p">;</span><span class="w"></span>

<span class="cm">/* 下面的用法，旧标准的定义同样适用 */</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">flag</span><span class="p">)</span><span class="w"></span>
<span class="w">    </span><span class="cm">/* 条件为真时 */</span><span class="p">;</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="o">!</span><span class="n">flag</span><span class="p">)</span><span class="w"></span>
<span class="w">    </span><span class="cm">/* 条件为假时 */</span><span class="p">;</span><span class="w"></span>
</code></pre></div>
      </div>
      <div class="back-to-top">
        <a href="/">HOME</a>
        <a href="#top">TOP</a>
      </div>
    </article>
  </div>
<!-- end article -->
<!-- 页面往下滚动一段之后才会显示TOC -->
<script>
  window.onscroll = function() {
    var tocbox = document.getElementsByClassName('toc')[0];
    var osTop = document.documentElement.scrollTop || document.body.scrollTop;
    var osWidth = document.documentElement.scrollWidth || document.body.scrollWidth;
    // console.log(osTop)
    if (osTop>300 && osWidth>865) {
      tocbox.style.display = "block"
    }
    if (osTop<300 || osWidth<865) {
      tocbox.style.display = "none"
    }
  }
</script>
                <footer>
                    <div class="icons">
                    </div>
                    <span id="busuanzi_container_page_pv" style="padding: 10px">本文阅读量<span id="busuanzi_value_page_pv"></span>次</span>
                    <span id="busuanzi_container_site_pv" style="padding: 10px">本站总访问量<span id="busuanzi_value_site_pv"></span>次</span>
                    <span id="busuanzi_container_site_uv" style="padding: 10px">本站总访客数<span id="busuanzi_value_site_uv"></span>人</span>
                    <p>© <script>document.write(moment().format('YYYY'));</script> 749B</p>
                </footer>
        </div>
</body>
</html>